home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / utility / cbhd502 / src / c / scsidisk.c < prev    next >
C/C++ Source or Header  |  1997-01-21  |  5KB  |  200 lines

  1. /*{{{}}}*/
  2. /*********************************************************************
  3.  *
  4.  * Kommandos zum Zugriff auf Platten
  5.  *
  6.  * $Source: u:\k\usr\src\scsi\cbhd\rcs\scsidisk.c,v $
  7.  *
  8.  * $Revision: 1.3 $
  9.  *
  10.  * $Author: Steffen_Engel $
  11.  *
  12.  * $Date: 1996/02/14 11:21:56 $
  13.  *
  14.  * $State: Exp $
  15.  *
  16.  **********************************************************************
  17.  * History:
  18.  *
  19.  * $Log: scsidisk.c,v $
  20.  * Revision 1.3  1996/02/14  11:21:56  Steffen_Engel
  21.  * Korrektur von cMaxBlockAdr
  22.  *
  23.  * Revision 1.2  1995/11/28  19:14:14  S_Engel
  24.  * *** empty log message ***
  25.  *
  26.  * Revision 1.1  1995/11/13  23:45:30  S_Engel
  27.  * Initial revision
  28.  *
  29.  *
  30.  *
  31.  *********************************************************************/
  32.  
  33. #include <import.h>
  34. #include <portab.h>
  35.  
  36. #include <scsidrv/scsiio.h>
  37. #include <scsidrv/scsi.h>
  38.  
  39. #include <export.h>
  40. #include <scsidrv/scsidisk.h>
  41.  
  42.  
  43. LONG Read6(ULONG BlockAdr,
  44.                 UWORD TransferLen, void *buffer)
  45. {{{
  46. LONG ret;
  47. tCmd6 Cmd;
  48.  
  49.   while (TransferLen > MaxDmaLen / BlockLen)
  50.   {
  51.     SetCmd6(&Cmd, 0x08, BlockAdr, MaxDmaLen / BlockLen);
  52.     ret = In(SetCmd((BYTE *)&Cmd, 6, buffer, MaxDmaLen / BlockLen * BlockLen, DefTimeout));
  53.     if (ret != 0)
  54.       return ret;
  55.  
  56.     BlockAdr += MaxDmaLen / BlockLen;
  57.     TransferLen -= MaxDmaLen / BlockLen;
  58.     buffer = (void *)((long)buffer + MaxDmaLen / BlockLen * BlockLen);
  59.   }
  60.  
  61.   SetCmd6(&Cmd, 0x08, BlockAdr, TransferLen);
  62.   return In(SetCmd((BYTE *)&Cmd, 6, buffer, BlockLen * (ULONG)TransferLen, DefTimeout));
  63. }}}
  64.  
  65. LONG Read10(ULONG BlockAdr,
  66.                 UWORD TransferLen, void *buffer)
  67. {{{
  68. LONG ret;
  69. tCmd10 Cmd;
  70.  
  71.   while (TransferLen > MaxDmaLen / BlockLen)
  72.   {
  73.     SetCmd10(&Cmd, 0x028, BlockAdr, MaxDmaLen / BlockLen);
  74.     ret = In(SetCmd((BYTE *)&Cmd, 10, buffer, MaxDmaLen / BlockLen * BlockLen, 20*200));
  75.     if (ret != 0)
  76.       return ret;
  77.     BlockAdr += MaxDmaLen / BlockLen;
  78.     TransferLen -= MaxDmaLen / BlockLen;
  79.     buffer = (void *)((long)buffer + MaxDmaLen / BlockLen * BlockLen);
  80.   }
  81.  
  82.   SetCmd10(&Cmd, 0x028, BlockAdr, TransferLen);
  83.   return In(SetCmd((BYTE *)&Cmd, 10, buffer, BlockLen * (ULONG)TransferLen, 20*200));
  84. }}}
  85.  
  86.  
  87. LONG Write6(ULONG BlockAdr,
  88.                 UWORD TransferLen, void *buffer)
  89. {{{
  90. LONG ret;
  91. tCmd6 Cmd;
  92.  
  93.   while (TransferLen > MaxDmaLen / BlockLen)
  94.   {
  95.     SetCmd6(&Cmd, 0x0A, BlockAdr, MaxDmaLen / BlockLen);
  96.     ret = Out(SetCmd((BYTE *)&Cmd, 6, buffer, MaxDmaLen / BlockLen * BlockLen, 20*200));
  97.     if (ret != 0)
  98.       return ret;
  99.     BlockAdr += MaxDmaLen / BlockLen;
  100.     TransferLen -= MaxDmaLen / BlockLen;
  101.     buffer = (void *)((long)buffer + MaxDmaLen / BlockLen * BlockLen);
  102.   }
  103.  
  104.   SetCmd6(&Cmd, 0x0A, BlockAdr, TransferLen);
  105.   return Out(SetCmd((BYTE *)&Cmd, 6, buffer, BlockLen * (ULONG)TransferLen, 20*200));
  106. }}}
  107.  
  108. LONG Write10(ULONG BlockAdr,
  109.                 UWORD TransferLen, void *buffer)
  110. {{{
  111. LONG ret;
  112. tCmd10 Cmd;
  113.  
  114.   while (TransferLen > MaxDmaLen / BlockLen)
  115.   {
  116.     SetCmd10(&Cmd, 0x02A, BlockAdr, MaxDmaLen / BlockLen);
  117.     ret = Out(SetCmd((BYTE *)&Cmd, 10, buffer, MaxDmaLen / BlockLen * BlockLen, 20*200));
  118.     if (ret != 0)
  119.       return ret;
  120.     BlockAdr += MaxDmaLen / BlockLen;
  121.     TransferLen -= MaxDmaLen / BlockLen;
  122.     buffer = (void *)((long)buffer + MaxDmaLen / BlockLen * BlockLen);
  123.   }
  124.  
  125.   SetCmd10(&Cmd, 0x02A, BlockAdr, TransferLen);
  126.   return Out(SetCmd((BYTE *)&Cmd, 10, buffer, BlockLen * (ULONG)TransferLen, 20*200));
  127. }}}
  128.  
  129.  
  130. #define cMaxBlockAdr  0x001FFFFF /* Max. Blocknummer bei Read6/Write6  */
  131.  
  132.  
  133. LONG Read(ULONG BlockAdr,
  134.               UWORD TransferLen, void *buffer)
  135. {{{
  136.   if (BlockAdr > cMaxBlockAdr)
  137.     return Read10(BlockAdr, TransferLen, buffer);
  138.   else
  139.     return Read6(BlockAdr, TransferLen, buffer);
  140. }}}
  141.  
  142.  
  143. LONG Write(ULONG BlockAdr,
  144.               UWORD TransferLen, void *buffer)
  145. {{{
  146.   if (BlockAdr > cMaxBlockAdr)
  147.     return Write10(BlockAdr, TransferLen, buffer);
  148.   else
  149.     return Write6(BlockAdr, TransferLen, buffer);
  150. }}}
  151.  
  152.  
  153.  
  154. LONG StartStop(BOOLEAN LoadEject, BOOLEAN StartFlag)
  155. {{{
  156. tCmd6 Cmd;
  157.  
  158.   if (StartFlag)
  159.     SetCmd6(&Cmd, 0x01B,0,1);
  160.   else
  161.     SetCmd6(&Cmd, 0x01B,0,0);
  162.  
  163.   if (LoadEject)
  164.     Cmd.Len |= 2;
  165.  
  166.   return In(SetCmd((BYTE *)&Cmd, 6, NULL, 0, 60*200));
  167. }}}
  168.  
  169.  
  170. LONG ReadCapacity(BOOLEAN PMI, ULONG *BlockAdr, ULONG *BlockLen)
  171. {{{
  172. ULONG Data[2];
  173. LONG ret;
  174. tCmd10 Cmd;
  175.  
  176.   SetCmd10(&Cmd, 0x25, *BlockAdr, 0);
  177.  
  178.   if (PMI)
  179.     Cmd.LenLow = 1;
  180.  
  181.   /* und rufen */
  182.   ret = In(SetCmd((BYTE *)&Cmd, 10, Data, sizeof(Data), DefTimeout));
  183.  
  184.   /* und Antwort, bitte */
  185.   if (ret == 0)
  186.   {
  187.     *BlockAdr = Data[0];
  188.     *BlockLen = Data[1];
  189.   }
  190.  
  191.   return ret;
  192. }}}
  193.  
  194.  
  195. BOOLEAN init_scsidisk (void)
  196. {{{
  197.   return TRUE;  /* hier gibts nix zu tun */
  198. }}}
  199.  
  200.